﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Libreria.DAL;

namespace Libreria.SIG.Modelo
{
    [CAD(true, CAD.TiposBD._SQLServer)]
    public class Receta
    {
        // Atributo de abstracción
        private MOR accesoADatos;
        // Atributo de la clase
        private Int32? codigo;
        private String nombre;
        private String foto;
        private Int32? dificultad;
        private Int32? tiempo;
        private Int32? calorias;
        private Int32? porciones;
        private String instrucciones;
        private Int32? tipoReceta;
        private String autorReceta;

        //Constructores
        public Receta()
        {
        }

        public Receta(string cadenaDeConexion)
        {
            this.accesoADatos = MOR.Instance(cadenaDeConexion);
        }

        // Encapsulamiento de los atributos
        [Tipo(Tipo.TiposSQLServer._int, "codigoReceta", true, true)]
        public Int32? Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Foto
        {
            get { return foto; }
            set { foto = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int)]
        public Int32? Dificultad
        {
            get { return dificultad; }
            set { dificultad = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int)]
        public Int32? Tiempo
        {
            get { return tiempo; }
            set { tiempo = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int)]
        public Int32? Calorias
        {
            get { return calorias; }
            set { calorias = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int)]
        public Int32? Porciones
        {
            get { return porciones; }
            set { porciones = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Instrucciones
        {
            get { return instrucciones; }
            set { instrucciones = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int, "CodigoTipo")]
        public Int32? TipoReceta
        {
            get { return tipoReceta; }
            set { tipoReceta = value; }
        }

        public Int32 TipoRecetaConvertido
        {
            get {
                Int32 trConvertido = 0;
                if (TipoReceta.ToString() != null)
                {
                    Int32.TryParse(TipoReceta.ToString(), out trConvertido);
                }
                return trConvertido; 
            }
            set { tipoReceta = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String AutorReceta
        {
            get { return autorReceta; }
            set { autorReceta = value; }
        }

        // Métodos de abstracción de datos
        public void crear()
        {
            this.Codigo = this.accesoADatos.crearRegistro(this);
        }

        public List<Receta> consultar()
        {
            List<Object> registros = this.accesoADatos.consultarRegistros(this, false);
            List<Receta> resultado = new List<Receta>();
            foreach (Object registro in registros)
            {
                resultado.Add((Receta)registro);
            }
            return resultado;
        }

        public List<Receta> consultarPorTipo(Int32 TipoReceta)
        {
            List<Object> registros = this.accesoADatos.consultarRegistros(this, false);
            List<Receta> resultado = new List<Receta>();
            foreach (Object registro in registros)
            {
                if (((Receta)registro).TipoReceta == TipoReceta)
                {
                    resultado.Add((Receta)registro);
                }
            }
            return resultado;
        }

        public Receta consultarPorCodigo(Int32 codigo)
        {
            this.Codigo = codigo;
            List<Object> registros = this.accesoADatos.consultarRegistros(this, true);
            Receta resultado = null;
            if (registros != null)
            {
                if (registros.Count == 1)
                {
                    resultado = (Receta)registros[0];
                }
            }
            return resultado;
        }

        public void actualizar()
        {
            this.accesoADatos.actualizarRegistro(this);
        }

        public void eliminar()
        {
            this.accesoADatos.borrarRegistro(this);
        }

    }
}
